__all__=(
    "ABE",
)

import os
from binascii import b2a_hex
from common.path import getABETmpPath

class Paths:
    f = lambda x:getABETmpPath(x)
    pub_key = f("pub_key")
    master_key = f("master_key")
    user_priv_key = f("user_priv_key")
    user_security_file = f("user_security_file")
    user_security_file_cpabe = f("user_security_file.cpabe")    

class ABE:

    def convert_hex(self,orig_str):
        str1 = orig_str.encode()
        str2 = b2a_hex(str1)
        str3 = str2.decode()
        return 'x' + str3

    def convert_attrs_list(self,list):
        str = ''
        for attr in list:
            str = str + self.convert_hex(attr) + " "
        str = str[:-1]
        return str

    def attrs_and(self,orig_list):
        str = ''
        for attr in orig_list:
            str = str + attr + " and "
        str = str[:-5]
        return str

    def convert_policy_list(self,policy_list):
        result = ''
        for num in policy_list:
            if (isinstance(num, str)):
                num = self.convert_hex(num)
                result = result + num + " or "
            elif (isinstance(num, list)):
                result = result + "( " + self.attrs_and(num) + " ) or "
        result = '\'' + result[:-4] + '\''
        return result

    # @Output(pub_key, master_key)
    def setup(self):
        """
        返回公钥pub_key（字节流字符串） 和 主密钥master_key（字节流字符串）
        :return:
        """
        os.system("cpabe-setup -p {pub_key} -m {master_key}".format(
            pub_key=Paths.pub_key, 
            master_key=Paths.master_key
        ))

        file = open(Paths.pub_key, "rb")
        pub_key = file.read()
        file.close()

        file = open(Paths.master_key, "rb")
        master_key = file.read()
        file.close()

        return pub_key, master_key

    # @Input(pub_key,master_key,user_attr)
    # @Output(user_priv_key)
    def keygen(self, pub_key_content, master_key_content, user_attrs_list):
        """
        输入公钥pub_key(字节流字符串）,主密钥master_key（字节流字符串）,用户属性集user_attrs_list（列表）
        输出用户私钥user_priv_key（字节流字符串）
        :return:
        """
        file = open(Paths.pub_key, "wb")
        file.write(pub_key_content)
        file.close()

        file = open(Paths.master_key, "wb")
        file.write(master_key_content)
        file.close()

        str_user_attrs = self.convert_attrs_list(user_attrs_list)
        os.system(
            "cpabe-keygen -o {user_priv_key} {pub_key} {master_key} ".format(
                user_priv_key = Paths.user_priv_key,
                pub_key = Paths.pub_key,
                master_key = Paths.master_key
            ) 
            + str_user_attrs
        )
        file = open(Paths.user_priv_key, "rb")
        user_priv_key = file.read()
        file.close()

        return user_priv_key

    # @Input(pub_key,msg,access_policy)
    # @Output(ciphertext)
    def encrypt(self, pub_key_content, msg, access_policy):
        """
        输入公钥pub_key(字节流字符串）,明文（字符串）,访问策略（列表）
        输出密文ciphertext（字节流字符串）
        :return:
        """
        file = open(Paths.pub_key, "wb")
        file.write(pub_key_content)
        file.close()

        file = open(Paths.user_security_file, "w")
        file.write(msg)
        file.close()

        str_access_policy = self.convert_policy_list(access_policy)
        os.system(
            "cpabe-enc {pub_key} {user_security_file} ".format(
                pub_key = Paths.pub_key,
                user_security_file = Paths.user_security_file
            )
            + str_access_policy
        )

        file = open(Paths.user_security_file_cpabe, "rb")
        ciphertext = file.read()
        file.close()

        return ciphertext

    # @Input(pub_key,user_priv_key,ciphertext)
    # @Output(msg)
    def decrypt(self, pub_key_content, user_priv_key_content, ciphertext):
        """
        输入公钥pub_key(字节流字符串）,用户私钥user_priv_key（字节流字符串）,密文ciphertext（字节流字符串）
        输出明文msg（字符串）
        :return:
        """
        file = open(Paths.pub_key, "wb")
        file.write(pub_key_content)
        file.close()

        file = open(Paths.user_priv_key, "wb")
        file.write(user_priv_key_content)
        file.close()

        file = open(Paths.user_security_file_cpabe, "wb")
        file.write(ciphertext)
        file.close()

        os.system("cpabe-dec {pub_key} {user_priv_key} {user_security_file_cpabe}".format(
            pub_key = Paths.pub_key,
            user_priv_key = Paths.user_priv_key,
            user_security_file_cpabe = Paths.user_security_file_cpabe
        ))

        file = open(Paths.user_security_file)
        msg = file.read()
        file.close()

        return msg


if __name__ == '__main__':
    abeObj = ABE()

    pub_key, master_key = abeObj.setup()
    print("公共秘钥 =>   ", pub_key)
    print("\n\n\n\n\n")
    print("主密钥 =>   ", master_key)
    print("\n\n\n\n\n")
#b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80\x1e\x1f\x04k\xb4\x8d\x98\xd3\xdd[\xd0\xec$KG\'\xa0\xe4\x95eO\x06w\xf9\xa1-\xc0\x9b\x81c\x9f\x86I\xa5\xe4\x1e\xd9%EH\xe8\xe7\t1\x07\x16k\xc2Yr<\xce\x02]Q\xb9\xe7_\xaeZ\x88\xe8\xa8\x16\x0co\xfc?i\x16\xd6\xf3\xdd=\xd1\xe9O\xb2\xc9\x9f\x17\x1f/\xec\x17\x96"\x88\x06g\xe6\xe2\xee\xe9o\xec\xf6\xc1\x8f%\rh\'\x1e:\xf8\x04\xe0\x9a\xae\xebCt/\xb0d\xe4L\xae\xdd\xfb\x99\x82w\x0c \xac$\x00\x00\x00\x80\x1f\xb3\xd5\x0c\x00\xcb\x0f\xca\xa9\x85\xd2\x9c\xb3C\xfc\xb2!3\x7fL6p\xa1\xeb\x939\xd51\x1b\xa1\xda\x80\xc0\xca8\xd8\x14$\xf7 \xb7\xa9\x14\xfeC\x11t\\R\x80I\x1d\xde\xfc\xe7O3\xd6]\x8f\t\xbb`\x01#\xed\x04`\x90@\x14\xb3\x1b\x98\x8b\xa8\x02?1\xe4/+2\x14\x0fr\xba\x8dr\xef\xda!;\t\x0eX\xe0\xfb\xba\x16\x89\x00I\x19\x17\xaf\xbc#\xea9\x0f)+\x81\xba\x95,\xab\x82+S)\x96\x13z\xc8*R\x00\x00\x00\x80\x85t\xcc\x1e\xb4A"d?\xcb!J\x00B(\xbf8\xca\xd9\xba#\xb0\x03\xa5\xf35\x88\xbapz2\xcd\xd7\xd3\xf9\xb1\x80\xdd\x12e\x853\x9fK\x8f6Y=D\x0f \xc8\xf3\x12\xec1R\xd3lyY\xddk\xc4[\xf88\xc5\x19\xfcI\xdb\xa0\x99=\xbe\x92\xde\xfd3e\xd4OR\xdf\x06\xf1FGZ\xb79\xadO!\xaeQ\xa3yY\xc4\xe5[\xb2;\x83\xa4\x91\xfa\xd7\xba\n\x0c\x96\xd1>\xc4\xc1\xeeI5\xdd\xee\xf6\xd9\xdf\xbc\xfd\x00\x00\x00\x80\x96N\x05\x93|\xc2u\x0e|(\x9b\xd0\xbd\x04\xc4&\x07\x92\\d\xa5(\xd2\xcd\x06\x1cG\x99\x0c\xcc\xfe\xee\xee\xcf3J\x89\xd4\xfaM\xc0%\xfc7\t\xcc\xb7\xab\x89s\x93\x8d\x83\xe4\x82\xe5~\xe2{\xa2\xd8\x833\x00\x8f\xbc\xc52.6E|\xe0\x97> \xc5\x0e/_\xb0\x11\xc7\x93\x8c6:\x05\x93\x8b\x90\xe5`\xf0\xaf\x9dI\xf2\xde\xdb\'\xf5\x89L\x97\xc0`\xf5\xc3\xcej\xa5\xd2#7\x90]\xea^R\x8c\x1e$\xe5\x13`\x81x'
#b"\x00\x00\x00\x14\x1d\xee8\x81\xa2\xb1\xd9\x838?F\xb4\x7f\\\\\xf5\x1f\xf4 \xbd\x00\x00\x00\x80\x1b\xfcJ+\x9a\x0e8e7z\x0cN2uU\x8a\x17\xd3)\xa3\xc9\xf0.t\x0e\x9e4\x83\x12\x83\x14)\xba\xd2\xed;\xb6-\xd7\x04\xb0\xc7a\xb4\xd8?\xf6\xfaB\n~\xeb\xde\xc8T\x0c\xfd\xd2\xed&\x9c\xea\x7f<b\x0e4c~\x9ff\x8a\x1bUIo\xa7x\x0f\x05.\n\xfd\x97\xae#\xb0\xe0\xad\x91\xcfJ\x89\xc9\x9d2i\xdc\xf5 \xaf\xc0A\x0bC\x03\x81{\x9b\xdaG^hM\xdax\x11w\xa6u\xcf'\xa7\x8a\x02\xa9\xa0\xf1"

    user_priv_key = abeObj.keygen(
        b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80\x1e\x1f\x04k\xb4\x8d\x98\xd3\xdd[\xd0\xec$KG\'\xa0\xe4\x95eO\x06w\xf9\xa1-\xc0\x9b\x81c\x9f\x86I\xa5\xe4\x1e\xd9%EH\xe8\xe7\t1\x07\x16k\xc2Yr<\xce\x02]Q\xb9\xe7_\xaeZ\x88\xe8\xa8\x16\x0co\xfc?i\x16\xd6\xf3\xdd=\xd1\xe9O\xb2\xc9\x9f\x17\x1f/\xec\x17\x96"\x88\x06g\xe6\xe2\xee\xe9o\xec\xf6\xc1\x8f%\rh\'\x1e:\xf8\x04\xe0\x9a\xae\xebCt/\xb0d\xe4L\xae\xdd\xfb\x99\x82w\x0c \xac$\x00\x00\x00\x80\x1f\xb3\xd5\x0c\x00\xcb\x0f\xca\xa9\x85\xd2\x9c\xb3C\xfc\xb2!3\x7fL6p\xa1\xeb\x939\xd51\x1b\xa1\xda\x80\xc0\xca8\xd8\x14$\xf7 \xb7\xa9\x14\xfeC\x11t\\R\x80I\x1d\xde\xfc\xe7O3\xd6]\x8f\t\xbb`\x01#\xed\x04`\x90@\x14\xb3\x1b\x98\x8b\xa8\x02?1\xe4/+2\x14\x0fr\xba\x8dr\xef\xda!;\t\x0eX\xe0\xfb\xba\x16\x89\x00I\x19\x17\xaf\xbc#\xea9\x0f)+\x81\xba\x95,\xab\x82+S)\x96\x13z\xc8*R\x00\x00\x00\x80\x85t\xcc\x1e\xb4A"d?\xcb!J\x00B(\xbf8\xca\xd9\xba#\xb0\x03\xa5\xf35\x88\xbapz2\xcd\xd7\xd3\xf9\xb1\x80\xdd\x12e\x853\x9fK\x8f6Y=D\x0f \xc8\xf3\x12\xec1R\xd3lyY\xddk\xc4[\xf88\xc5\x19\xfcI\xdb\xa0\x99=\xbe\x92\xde\xfd3e\xd4OR\xdf\x06\xf1FGZ\xb79\xadO!\xaeQ\xa3yY\xc4\xe5[\xb2;\x83\xa4\x91\xfa\xd7\xba\n\x0c\x96\xd1>\xc4\xc1\xeeI5\xdd\xee\xf6\xd9\xdf\xbc\xfd\x00\x00\x00\x80\x96N\x05\x93|\xc2u\x0e|(\x9b\xd0\xbd\x04\xc4&\x07\x92\\d\xa5(\xd2\xcd\x06\x1cG\x99\x0c\xcc\xfe\xee\xee\xcf3J\x89\xd4\xfaM\xc0%\xfc7\t\xcc\xb7\xab\x89s\x93\x8d\x83\xe4\x82\xe5~\xe2{\xa2\xd8\x833\x00\x8f\xbc\xc52.6E|\xe0\x97> \xc5\x0e/_\xb0\x11\xc7\x93\x8c6:\x05\x93\x8b\x90\xe5`\xf0\xaf\x9dI\xf2\xde\xdb\'\xf5\x89L\x97\xc0`\xf5\xc3\xcej\xa5\xd2#7\x90]\xea^R\x8c\x1e$\xe5\x13`\x81x',
        b"\x00\x00\x00\x14\x1d\xee8\x81\xa2\xb1\xd9\x838?F\xb4\x7f\\\\\xf5\x1f\xf4 \xbd\x00\x00\x00\x80\x1b\xfcJ+\x9a\x0e8e7z\x0cN2uU\x8a\x17\xd3)\xa3\xc9\xf0.t\x0e\x9e4\x83\x12\x83\x14)\xba\xd2\xed;\xb6-\xd7\x04\xb0\xc7a\xb4\xd8?\xf6\xfaB\n~\xeb\xde\xc8T\x0c\xfd\xd2\xed&\x9c\xea\x7f<b\x0e4c~\x9ff\x8a\x1bUIo\xa7x\x0f\x05.\n\xfd\x97\xae#\xb0\xe0\xad\x91\xcfJ\x89\xc9\x9d2i\xdc\xf5 \xaf\xc0A\x0bC\x03\x81{\x9b\xdaG^hM\xdax\x11w\xa6u\xcf'\xa7\x8a\x02\xa9\xa0\xf1",
        ['sysadmin','it_department'])
    print("用户私钥 =>   ", user_priv_key)
    print("\n\n\n\n\n")
#b'\x00\x00\x00\x80q j|@Gc\x86#\xc2\x81\xe1\xce\x0c\\d\x9c\xed)FAri\xe5\n\x11\xb0jK\xe4%u\xa4*M\x15\x00\x88\x8dA\x02o\xe4z\\\x11\x1e\xeasK\x876\xcfv\x90qaQ\x02N=\xa5\xfa\xf4_\x0f\xea\xe3\x0c2\xb2\xb0\xec\x03\x17\xa1\xd35\x99\x01\xbe\x94G\xd0MsL\xde\xa23\x94\xef\x08\xcfd\xea\xf9\x15\xbf\xcd\xc0=]\xaf:Zd"m.\\\xc1\xf5?\x80d\x8c\t\xff\x14\xcdm#3H\xe2\x11\t\x00\x00\x00\x02x69745f6465706172746d656e74\x00\x00\x00\x00\x80\x1c\xcc\xe0\xe6\xb7\xc3\xad\xd66\x8b\x8b\xfa\xcc\xb6\x8dM\xa9uM\x80\xa0\xf2\x17\xf1%\xa32\x87\xbe?8\x00.\x02\xb4\x93\x9a\xdd\xdf:\'\xe9e\x8a\xc1\rbo\x10Tu\xb2\xc8,\xa0]*|wY\xc5%-\xcb,n\xb3\xf69 6x>J\xbe/\xc2^\xbd\xcd\xab\xe3\xca\xa6.\xb0Q\xf4\xfe\xa0`h\xe8\x93\x1d\x8f\x8fr\xce\xbc\xff\xfaV+v{\xfc\x08\x86\xe5\xde\xef\xd1C\xb2!\x820\xe9y\xdbM\xda\x07\x85\x1b\xe7w\x00\x00\x00\x80A\xa4\xab\x94\xdf\xa8\xb9\xad\xcb\xe2\xee0\x11\xd3\x8dg\xcd\xf1\'\xc2u\xdbv%\xac\xaek\xed\x87s\x00\xb7k\x11\x0c\x86\x92\xd7M\x98\x08\xe1\x0e\x1c\x85\x8c\x14\x99\xa3\x95\xd0\xd8\x05\xbb\x8c3:\xd8\xcd\x1a(\x8d\x08\x13]~\x81\xc1\xe9\x9b9;\xdd\xad\xa6\n\x8f\x99c\xa4\x00p\x19)3\x8f\x1e\x1c\xc8\xe5Gk\xd2\x05c\x83\x00\xf8\x0e\xda\x9f\xaa=\x8b\x17\x86\x03`\x80E\xc7\xa1N$\x95b\xca-\xa5>\xc0\xb9C\xb9\xb4*}\x86x73797361646d696e\x00\x00\x00\x00\x80A\xd6Ze\x19\x04b=\x0e\x01\x8d\xb1:5\x17g\xd8\x8f\xb9\xa9"\x7f\xfa\x8a\xaa\x0f\x83Y\x820\xd5f\xc9Q\x03\x9b\x06\x95\x81<\xe7\xce\x86}4 \x90 \xfb\x1a\x16\xc3IS\n\xdb\x0c\xda\xb2t\xa0c\x91%\x1f\x8a\xf8\xb3\x04\xbaN\xebu\xf9\xadn>N\x1b8\xe4H\x95\xaa\xf1@\xb0\x0c\x89>\x13y*\xb9cC\xe42$\xae\xf9\\\xb1\x01\xe6#K\x02\xcf\xb5\n\xaa\xbb\xf9X\xdfM\xc2N\x95\x88\x9f\xb7\xbb\tk\'\xb2\x00\x00\x00\x80lb\xb2\xc0:t\xbc\xa2\xd5-\x956k\xd8\xfe\x0c\xa3\xd5MQD \xec]<\xc9S\xd6<R\x9c\xf77\x9d\xbd\xc3\xf3M\x17\xe1P\xd2RIx\xbb\xba\x9eHF\xb3\xec\xa4\x02\xf9H\x93<\xb68!h\xbb\xc1\x02\n \x1c\x9f\x02\x1b\x01\xffE\x9a0\xf9Y^\xedn\xe5\x1es\x0fr\xccL\x90q\x16_\xc0\xed\x8e\xc3\x8fF/\xc8F\xec\x12\x98Gp\x0c\x9c${X\x1a=0\xbd:\xa3\x83\x1d\xd8\xb9P#\xe8\x1c\x01j\x7f'


    ciphertext = abeObj.encrypt(
        b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80\x1e\x1f\x04k\xb4\x8d\x98\xd3\xdd[\xd0\xec$KG\'\xa0\xe4\x95eO\x06w\xf9\xa1-\xc0\x9b\x81c\x9f\x86I\xa5\xe4\x1e\xd9%EH\xe8\xe7\t1\x07\x16k\xc2Yr<\xce\x02]Q\xb9\xe7_\xaeZ\x88\xe8\xa8\x16\x0co\xfc?i\x16\xd6\xf3\xdd=\xd1\xe9O\xb2\xc9\x9f\x17\x1f/\xec\x17\x96"\x88\x06g\xe6\xe2\xee\xe9o\xec\xf6\xc1\x8f%\rh\'\x1e:\xf8\x04\xe0\x9a\xae\xebCt/\xb0d\xe4L\xae\xdd\xfb\x99\x82w\x0c \xac$\x00\x00\x00\x80\x1f\xb3\xd5\x0c\x00\xcb\x0f\xca\xa9\x85\xd2\x9c\xb3C\xfc\xb2!3\x7fL6p\xa1\xeb\x939\xd51\x1b\xa1\xda\x80\xc0\xca8\xd8\x14$\xf7 \xb7\xa9\x14\xfeC\x11t\\R\x80I\x1d\xde\xfc\xe7O3\xd6]\x8f\t\xbb`\x01#\xed\x04`\x90@\x14\xb3\x1b\x98\x8b\xa8\x02?1\xe4/+2\x14\x0fr\xba\x8dr\xef\xda!;\t\x0eX\xe0\xfb\xba\x16\x89\x00I\x19\x17\xaf\xbc#\xea9\x0f)+\x81\xba\x95,\xab\x82+S)\x96\x13z\xc8*R\x00\x00\x00\x80\x85t\xcc\x1e\xb4A"d?\xcb!J\x00B(\xbf8\xca\xd9\xba#\xb0\x03\xa5\xf35\x88\xbapz2\xcd\xd7\xd3\xf9\xb1\x80\xdd\x12e\x853\x9fK\x8f6Y=D\x0f \xc8\xf3\x12\xec1R\xd3lyY\xddk\xc4[\xf88\xc5\x19\xfcI\xdb\xa0\x99=\xbe\x92\xde\xfd3e\xd4OR\xdf\x06\xf1FGZ\xb79\xadO!\xaeQ\xa3yY\xc4\xe5[\xb2;\x83\xa4\x91\xfa\xd7\xba\n\x0c\x96\xd1>\xc4\xc1\xeeI5\xdd\xee\xf6\xd9\xdf\xbc\xfd\x00\x00\x00\x80\x96N\x05\x93|\xc2u\x0e|(\x9b\xd0\xbd\x04\xc4&\x07\x92\\d\xa5(\xd2\xcd\x06\x1cG\x99\x0c\xcc\xfe\xee\xee\xcf3J\x89\xd4\xfaM\xc0%\xfc7\t\xcc\xb7\xab\x89s\x93\x8d\x83\xe4\x82\xe5~\xe2{\xa2\xd8\x833\x00\x8f\xbc\xc52.6E|\xe0\x97> \xc5\x0e/_\xb0\x11\xc7\x93\x8c6:\x05\x93\x8b\x90\xe5`\xf0\xaf\x9dI\xf2\xde\xdb\'\xf5\x89L\x97\xc0`\xf5\xc3\xcej\xa5\xd2#7\x90]\xea^R\x8c\x1e$\xe5\x13`\x81x',
        "123456abc", ["sysadmin"])
    print("加密后的密文 =>  ", ciphertext)
    print("\n\n\n\n\n")
#b'\x00\x00\x00\t\x00\x00\x00\x10Q\x808\x0c\xb6\xb9N\xc0\n\xe98\xc0\xbc\xa3\xe1i\x00\x00\x02*\x00\x00\x00\x80c\\\xd7H\xa9\xfd>\x81\x96\xd6\xe7\xd9\xfc#\xec\xe4\xf1\xf4H\xdf\x14\xb6LS\xfb*$mf\x82b\xfdmf/\xd1\x85\x15\x90|\xc1\xc5M\xa3j\x9c>R\xc0\xe1\x18\xb9\x00J@f\xd9\xd6\x9b\x0bLL\xae\xe8\x8e\xaa\xc8-\xd2\xb2\xfa\t\xc1\xfeb\xa63\x90;\xc0\x92\xc3\xael\xb3M\xfd\x88\x82\xec\xba\x11\xdf5\xa7\xbc=@\x81pt\xc9\xdb\x01\x14\x10\xa8\xdb\xf6\xe9\x1dr\xdfz\xffP\xee\x19\x106mG\xae\xdf\xe6?!_\x00\x00\x00\x80Z\xf7\xd3,\x86\xb6OP\x04\x84\xcd\xbc+Hu\xa0\xac\x06?\xe5\xb4\xb8h\xf0I\x85\xedd\x92+\x86\xc2&D\xd8?\xa9P\xec\xc8\xa4}\xf0\xb6\ru\x0f?\xad\xd0\x01\x82\xdbmC\xa5\xd6\x918z#\x93\xacBZ\xe6\x1c\x14|\xba\xe5\xc3K\x00\xc4~ \xccG\x88D\xad\xc8\xeb\x16\xdc\xbe\x0e2h\xfd\xed@\x08\xdd\xca]lwK\x93\x08\xe8v\xdf\x140\x1aBU\xb6"u\xba\x7f%\xfa\xfb\xc9b\x16j\x16\x15\xa6T6L\x00\x00\x00\x01\x00\x00\x00\x00x73797361646d696e\x00\x00\x00\x00\x80\x91\xa5Y\x01%\xe8\xe7;\x0e\xb7\xd5\x7f\x02\xb3\xb9\xd2\x87\x11\xb7\xb65%Y\x11\r\xf1\xcb\x88\x01\xda\xbd6Si3H\xaa\x01\xca\xeb\xd0\xc6\'\x00\xbd\x8e\x91\x99\xb0\xa2h\xb2 R\xb87\\\xce\xee)P\xba\xcd\x89\x1f[\x96\x7f\x86\xe4\xc3P\xad\xcf\x1d\x01\x0c;\x8dF\xefY\xe1\x8f\x07\xc49\xed\xac\xa6\xc4\x93]\x7frs\xcc\x05\xdf\xa6\x02\x9f\xa5\x0c\\_\xedS\xaa\x94\x90\xcb\x08\xb9&~B\ngiL\xc5\xc6\xa0\x9e\n\xbb\x92\x00\x00\x00\x805R\xc4\xeb\xe4\xab\x05~CB\xf3\xc9<\xefL+j\xb7\xbd\xe2\x88\xe9)!6\x9b9\r\xef\n;8\xbeyi\tN\xf3BN\x00^\xc8\xeb]cW:/\xac\x07\xb49\x90\xe6\x14P\x879^L\xa7\xb6\xf2j\n\xb2G\xff\xe3P\xc3\xd0\x1c\x10\x8f\x9b\xaf_\xe7\x16\xe2Hr-\xfbta\xa8\x90\x19o\x83\x95\xf8*A\xa0gZ\x862\x90&\x9cOi\xab]\x9d+\xb9\x97\xd7\x1b\x1f\xb8#\x07:,F\xa3\xeb\x06\xa2\x82!'


    msg = abeObj.decrypt(
        b'type a\nq 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791\nh 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776\nr 730750818665451621361119245571504901405976559617\nexp2 159\nexp1 107\nsign1 1\nsign0 1\n\x00\x00\x00\x00\x80\x1e\x1f\x04k\xb4\x8d\x98\xd3\xdd[\xd0\xec$KG\'\xa0\xe4\x95eO\x06w\xf9\xa1-\xc0\x9b\x81c\x9f\x86I\xa5\xe4\x1e\xd9%EH\xe8\xe7\t1\x07\x16k\xc2Yr<\xce\x02]Q\xb9\xe7_\xaeZ\x88\xe8\xa8\x16\x0co\xfc?i\x16\xd6\xf3\xdd=\xd1\xe9O\xb2\xc9\x9f\x17\x1f/\xec\x17\x96"\x88\x06g\xe6\xe2\xee\xe9o\xec\xf6\xc1\x8f%\rh\'\x1e:\xf8\x04\xe0\x9a\xae\xebCt/\xb0d\xe4L\xae\xdd\xfb\x99\x82w\x0c \xac$\x00\x00\x00\x80\x1f\xb3\xd5\x0c\x00\xcb\x0f\xca\xa9\x85\xd2\x9c\xb3C\xfc\xb2!3\x7fL6p\xa1\xeb\x939\xd51\x1b\xa1\xda\x80\xc0\xca8\xd8\x14$\xf7 \xb7\xa9\x14\xfeC\x11t\\R\x80I\x1d\xde\xfc\xe7O3\xd6]\x8f\t\xbb`\x01#\xed\x04`\x90@\x14\xb3\x1b\x98\x8b\xa8\x02?1\xe4/+2\x14\x0fr\xba\x8dr\xef\xda!;\t\x0eX\xe0\xfb\xba\x16\x89\x00I\x19\x17\xaf\xbc#\xea9\x0f)+\x81\xba\x95,\xab\x82+S)\x96\x13z\xc8*R\x00\x00\x00\x80\x85t\xcc\x1e\xb4A"d?\xcb!J\x00B(\xbf8\xca\xd9\xba#\xb0\x03\xa5\xf35\x88\xbapz2\xcd\xd7\xd3\xf9\xb1\x80\xdd\x12e\x853\x9fK\x8f6Y=D\x0f \xc8\xf3\x12\xec1R\xd3lyY\xddk\xc4[\xf88\xc5\x19\xfcI\xdb\xa0\x99=\xbe\x92\xde\xfd3e\xd4OR\xdf\x06\xf1FGZ\xb79\xadO!\xaeQ\xa3yY\xc4\xe5[\xb2;\x83\xa4\x91\xfa\xd7\xba\n\x0c\x96\xd1>\xc4\xc1\xeeI5\xdd\xee\xf6\xd9\xdf\xbc\xfd\x00\x00\x00\x80\x96N\x05\x93|\xc2u\x0e|(\x9b\xd0\xbd\x04\xc4&\x07\x92\\d\xa5(\xd2\xcd\x06\x1cG\x99\x0c\xcc\xfe\xee\xee\xcf3J\x89\xd4\xfaM\xc0%\xfc7\t\xcc\xb7\xab\x89s\x93\x8d\x83\xe4\x82\xe5~\xe2{\xa2\xd8\x833\x00\x8f\xbc\xc52.6E|\xe0\x97> \xc5\x0e/_\xb0\x11\xc7\x93\x8c6:\x05\x93\x8b\x90\xe5`\xf0\xaf\x9dI\xf2\xde\xdb\'\xf5\x89L\x97\xc0`\xf5\xc3\xcej\xa5\xd2#7\x90]\xea^R\x8c\x1e$\xe5\x13`\x81x',
        b'\x00\x00\x00\x80q j|@Gc\x86#\xc2\x81\xe1\xce\x0c\\d\x9c\xed)FAri\xe5\n\x11\xb0jK\xe4%u\xa4*M\x15\x00\x88\x8dA\x02o\xe4z\\\x11\x1e\xeasK\x876\xcfv\x90qaQ\x02N=\xa5\xfa\xf4_\x0f\xea\xe3\x0c2\xb2\xb0\xec\x03\x17\xa1\xd35\x99\x01\xbe\x94G\xd0MsL\xde\xa23\x94\xef\x08\xcfd\xea\xf9\x15\xbf\xcd\xc0=]\xaf:Zd"m.\\\xc1\xf5?\x80d\x8c\t\xff\x14\xcdm#3H\xe2\x11\t\x00\x00\x00\x02x69745f6465706172746d656e74\x00\x00\x00\x00\x80\x1c\xcc\xe0\xe6\xb7\xc3\xad\xd66\x8b\x8b\xfa\xcc\xb6\x8dM\xa9uM\x80\xa0\xf2\x17\xf1%\xa32\x87\xbe?8\x00.\x02\xb4\x93\x9a\xdd\xdf:\'\xe9e\x8a\xc1\rbo\x10Tu\xb2\xc8,\xa0]*|wY\xc5%-\xcb,n\xb3\xf69 6x>J\xbe/\xc2^\xbd\xcd\xab\xe3\xca\xa6.\xb0Q\xf4\xfe\xa0`h\xe8\x93\x1d\x8f\x8fr\xce\xbc\xff\xfaV+v{\xfc\x08\x86\xe5\xde\xef\xd1C\xb2!\x820\xe9y\xdbM\xda\x07\x85\x1b\xe7w\x00\x00\x00\x80A\xa4\xab\x94\xdf\xa8\xb9\xad\xcb\xe2\xee0\x11\xd3\x8dg\xcd\xf1\'\xc2u\xdbv%\xac\xaek\xed\x87s\x00\xb7k\x11\x0c\x86\x92\xd7M\x98\x08\xe1\x0e\x1c\x85\x8c\x14\x99\xa3\x95\xd0\xd8\x05\xbb\x8c3:\xd8\xcd\x1a(\x8d\x08\x13]~\x81\xc1\xe9\x9b9;\xdd\xad\xa6\n\x8f\x99c\xa4\x00p\x19)3\x8f\x1e\x1c\xc8\xe5Gk\xd2\x05c\x83\x00\xf8\x0e\xda\x9f\xaa=\x8b\x17\x86\x03`\x80E\xc7\xa1N$\x95b\xca-\xa5>\xc0\xb9C\xb9\xb4*}\x86x73797361646d696e\x00\x00\x00\x00\x80A\xd6Ze\x19\x04b=\x0e\x01\x8d\xb1:5\x17g\xd8\x8f\xb9\xa9"\x7f\xfa\x8a\xaa\x0f\x83Y\x820\xd5f\xc9Q\x03\x9b\x06\x95\x81<\xe7\xce\x86}4 \x90 \xfb\x1a\x16\xc3IS\n\xdb\x0c\xda\xb2t\xa0c\x91%\x1f\x8a\xf8\xb3\x04\xbaN\xebu\xf9\xadn>N\x1b8\xe4H\x95\xaa\xf1@\xb0\x0c\x89>\x13y*\xb9cC\xe42$\xae\xf9\\\xb1\x01\xe6#K\x02\xcf\xb5\n\xaa\xbb\xf9X\xdfM\xc2N\x95\x88\x9f\xb7\xbb\tk\'\xb2\x00\x00\x00\x80lb\xb2\xc0:t\xbc\xa2\xd5-\x956k\xd8\xfe\x0c\xa3\xd5MQD \xec]<\xc9S\xd6<R\x9c\xf77\x9d\xbd\xc3\xf3M\x17\xe1P\xd2RIx\xbb\xba\x9eHF\xb3\xec\xa4\x02\xf9H\x93<\xb68!h\xbb\xc1\x02\n \x1c\x9f\x02\x1b\x01\xffE\x9a0\xf9Y^\xedn\xe5\x1es\x0fr\xccL\x90q\x16_\xc0\xed\x8e\xc3\x8fF/\xc8F\xec\x12\x98Gp\x0c\x9c${X\x1a=0\xbd:\xa3\x83\x1d\xd8\xb9P#\xe8\x1c\x01j\x7f',
        b'\x00\x00\x00\t\x00\x00\x00\x10Q\x808\x0c\xb6\xb9N\xc0\n\xe98\xc0\xbc\xa3\xe1i\x00\x00\x02*\x00\x00\x00\x80c\\\xd7H\xa9\xfd>\x81\x96\xd6\xe7\xd9\xfc#\xec\xe4\xf1\xf4H\xdf\x14\xb6LS\xfb*$mf\x82b\xfdmf/\xd1\x85\x15\x90|\xc1\xc5M\xa3j\x9c>R\xc0\xe1\x18\xb9\x00J@f\xd9\xd6\x9b\x0bLL\xae\xe8\x8e\xaa\xc8-\xd2\xb2\xfa\t\xc1\xfeb\xa63\x90;\xc0\x92\xc3\xael\xb3M\xfd\x88\x82\xec\xba\x11\xdf5\xa7\xbc=@\x81pt\xc9\xdb\x01\x14\x10\xa8\xdb\xf6\xe9\x1dr\xdfz\xffP\xee\x19\x106mG\xae\xdf\xe6?!_\x00\x00\x00\x80Z\xf7\xd3,\x86\xb6OP\x04\x84\xcd\xbc+Hu\xa0\xac\x06?\xe5\xb4\xb8h\xf0I\x85\xedd\x92+\x86\xc2&D\xd8?\xa9P\xec\xc8\xa4}\xf0\xb6\ru\x0f?\xad\xd0\x01\x82\xdbmC\xa5\xd6\x918z#\x93\xacBZ\xe6\x1c\x14|\xba\xe5\xc3K\x00\xc4~ \xccG\x88D\xad\xc8\xeb\x16\xdc\xbe\x0e2h\xfd\xed@\x08\xdd\xca]lwK\x93\x08\xe8v\xdf\x140\x1aBU\xb6"u\xba\x7f%\xfa\xfb\xc9b\x16j\x16\x15\xa6T6L\x00\x00\x00\x01\x00\x00\x00\x00x73797361646d696e\x00\x00\x00\x00\x80\x91\xa5Y\x01%\xe8\xe7;\x0e\xb7\xd5\x7f\x02\xb3\xb9\xd2\x87\x11\xb7\xb65%Y\x11\r\xf1\xcb\x88\x01\xda\xbd6Si3H\xaa\x01\xca\xeb\xd0\xc6\'\x00\xbd\x8e\x91\x99\xb0\xa2h\xb2 R\xb87\\\xce\xee)P\xba\xcd\x89\x1f[\x96\x7f\x86\xe4\xc3P\xad\xcf\x1d\x01\x0c;\x8dF\xefY\xe1\x8f\x07\xc49\xed\xac\xa6\xc4\x93]\x7frs\xcc\x05\xdf\xa6\x02\x9f\xa5\x0c\\_\xedS\xaa\x94\x90\xcb\x08\xb9&~B\ngiL\xc5\xc6\xa0\x9e\n\xbb\x92\x00\x00\x00\x805R\xc4\xeb\xe4\xab\x05~CB\xf3\xc9<\xefL+j\xb7\xbd\xe2\x88\xe9)!6\x9b9\r\xef\n;8\xbeyi\tN\xf3BN\x00^\xc8\xeb]cW:/\xac\x07\xb49\x90\xe6\x14P\x879^L\xa7\xb6\xf2j\n\xb2G\xff\xe3P\xc3\xd0\x1c\x10\x8f\x9b\xaf_\xe7\x16\xe2Hr-\xfbta\xa8\x90\x19o\x83\x95\xf8*A\xa0gZ\x862\x90&\x9cOi\xab]\x9d+\xb9\x97\xd7\x1b\x1f\xb8#\x07:,F\xa3\xeb\x06\xa2\x82!'
    )
    print("解密后的明文 =>  ",msg)





